const obj = {
  date: [1, 3, 5],
  teachers: {
    韩老师: "webpack,perf",
    高老师: "react",
    夏老师: "nodejs,wechat,safe",
    罗老师: "rn",
    厉老师: "flutter",
    盛老师: "test,interview,end,project,algorithm,pattern,react-src",
    杨老师: "vue",
    袁老师: "mp"
  },
  details: [
    {
      title: "vue01 组件化实践",
      content: `
            组件化技术大盘点
            通用组件设计思路
            element-ui体验
            实现自己的el-form
            弹框类组件实现及原理
            递归组件及应用之树形菜单
            element源码学习
            `,
      catg: "vue"
    },
    {
      title: "vue02 全家桶原理剖析",
      content: `
            vue-router需求分析
            vue-router源码实现
            vuex设计理念及需求分析
            vuex源码实现
          `,
      catg: "vue"
    },
    {
      title: "vue03 手写Vue",
      content: `
            MVVM设计理念和要素分析
            响应式原理及实现
            实现自己的vue
            vue中的数据响应式
            模板语法及编译 
            依赖收集及视图更新       
          `,
      catg: "vue"
    },
    {
      title: "vue04 vue源码剖析01",
      content: `
            开发调试环境准备
            入口文件查找
            vue初始化流程
            响应式原理
        `,
      catg: "vue"
    },
    {
      title: "vue05 vue源码剖析02",
      content: `
            异步更新策略
            虚拟DOM
            diff算法
        `,
      catg: "vue"
    },
    {
      title: "vue06 vue源码剖析03",
      content: `
            编译器原理
            常见指令工作原理
            组件机制
            事件机制
            双向绑定原理
          `,
      catg: "vue"
    },
    {
      title: "vue07 服务端渲染SSR",
      content: `
            服务端渲染原理
            vue ssr实战
            nuxt.js
            `,
      catg: "vue"
    },
    {
      title: "vue08 TypeScript实战",
      content: `
            ts核心语法
            ts+vue实战
            装饰器及其原理
            vue-property-decorator源码分析
        `,
      catg: "vue"
    },
    {
      title: "vue09 vue项目最佳实践",
      content: `
            配置策略
            权限控制
            动态路由
            动态导航菜单
            请求服务封装
            数据Mock
            请求代理
            测试                    
          `,
      catg: "vue"
    },
    {
      title: "vue10 vue3初探+响应式原理剖析",
      content: `
            调试环境搭建
            vue3
            Composition API
            响应式原理剖析
            展望
          `,
      catg: "vue"
    },

    {
      title: "React01 React组件化01",
      content: `高阶组件  
                设计并实现表单控件
                组件跨层级通信 - Context
                实现弹窗类组件`,
      catg: "react"
    },
    {
      title: "React02 redux源码实现",
      content: `
              redux、redux-thunk、redux-logger使用
              实现redux、redux-thunk、redux-logger
              `,
      catg: "react"
    },
    {
      title: "React03 react-redux源码实现",
      content: `
              掌握Hooks
              react-redux使用
              实现react-redux
              `,
      catg: "react"
    },
    {
      title: "React04 Router使用及实现",
      content: ` 
              react-router使用
              路由守卫
              实现react-router-dom`,
      catg: "react"
    },
    {
      title: "React5 企业级最佳实践01",
      content: `
              redux-saga
              实现用户登录`,
      catg: "react"
    },
    {
      title: "React06 企业级最佳实践02",
      content: `
              了解umi、dva、antd
              项目`,
      catg: "react"
    },
    {
      title: "React07 React原理解析01",
      content: `
              什么是虚拟dom、为什么使用虚拟dom以及如何使用
              JSX原理
              实现createElement、Component、render三个核心api`,
      catg: "react"
    },
    {
      title: "React08 React原理解析02",
      content: `
            虚拟dom的diff
            什么是fiber
            实现fiber`,
      catg: "react"
    },
    {
      title: "React9 React原理解析03",
      content: `
              实现hooks的useState
              如何调试源码
              查看React工作流程`,
      catg: "react"
    },

    {
      title: "React10 React原理解析04",
      content: `
              细解setState、forceUpdate、render
              源码调试查看React工作`,
      catg: "react"
    },
    {
      title: "休息",
      content: `
         休息
             `,

      catg: "rest"
    },
    {
      title: "Nodejs01 基础API与CLI",
      content: `
              异步I/O Stream Buffer Http
              手写一个CLI工具
              `,
      catg: "nodejs"
    },
    {
      title: "Nodejs02 Koa源码",
      content: `
        context上下文
        中间件机制
        router中间件
        静态服务中间件
      `,
      catg: "nodejs"
    },
    {
      title: "Nodejs03 网络编程",
      content: `
                socket套接字编程
                http协议 跨域 反向代理 爬虫 反向代理 bodyparser
                上传原理
                websocket
      `,
      catg: "nodejs"
    },
    {
      title: "Nodejs04 Mysql",
      content: `
                mysql 
                sequelize
                电商sequlize实战
                `,
      catg: "nodejs"
    },
    {
      title: "Nodejs05 Mongoose",
      content: `
                mongo native
                mongoose
                零编码Restful
              `,
      catg: "nodejs"
    },
    {
      title: "Nodejs06 鉴权",
      content: `
                cookie-session
                token jwt原理解析
                扩展Oauth2 与 SSO单点登录
      `,
      catg: "nodejs"
    },
    {
      title: "Nodejs07 eggjs原理解析",
      content: `
                实现一个MVC框架
                约定优于配置 控制器层 服务层 实体层
                定时器 中间件
      `,
      catg: "nodejs"
    },
    {
      title: "Nodejs08 eggjs最佳实践",
      content: `
                swager 接口文档
                plugin
                restful服务
                表单校验
                jwt鉴权
                生命周期函数 初始化数据
                上传upload
      `,
      catg: "nodejs"
    },
    {
      title: "Nodejs09 手写TS装饰器",
      content: `
                装饰器与AOP
                路由装饰器
                校验装饰器
                模型装饰器
      `,
      catg: "nodejs"
    },
    {
      title: "Nodejs10 部署_Docker_自动化部署",
      content: `
                  部署 cluster模块、PM2、静态服务、反向代理
                  docker基础
                  github webhooks 自动化部署
                  `,
      catg: "nodejs"
    },
    {
      title: "项目课",
      content: `
        项目先导课
        整体架构分析
                  `,
      catg: "project"
    },
    {
      title: "微信公众号开发",
      content: `
                ngrok
                消息接口
                服务器端接口调用
      `,
      catg: "wechat"
    },
    {
      title: "全栈开发之中台专题",
      content: `
              什么是中台
              中台的划分
              代码概念
              业务实践
      `,
      catg: "nodejs"
    },
    {
      title: "前端安全 常见攻击手段攻防演练",
      content: `
                XSS、CSRF、点击劫持、SQL注入、OS注入、DDOS简介
      `,
      catg: "safe"
    },
    {
      title: "工程化01",
      content: "工程化01",
      catg: "webpack"
    },
    {
      title: "serverless",
      content: `
              什么是 serverless
              serverless 异同
              serverless 架构
              serverless 实践
      `,
      catg: "nodejs"
    },
    {
      title: "eventLoop",
      content: `
              eventLoop
      `,
      catg: "nodejs"
    },
    {
      title: "工程化02 进阶",
      content: "工程化02",
      catg: "webpack"
    },
    {
      title: "工程化03",
      content: "工程化03",
      catg: "webpack"
    },
    {
      title: "工程化04",
      content: "工程化04",
      catg: "webpack"
    },
    {
      title: "工程化05",
      content: "webpack源码",
      catg: "webpack"
    },

    // {
    //   title: '微信公众号开发02',
    //   content: '微信公众号开发02',
    //   catg: 'wechat'
    // },
    // {
    //   title: '微信公众号开发03',
    //   content: '微信公众号开发03',
    //   catg: 'wechat'
    // },
    // {
    //   title: '微信公众号开发04',
    //   content: '微信公众号开发04',
    //   catg: 'wechat'
    // },

    // {
    //   title: '项目01',
    //   content: '项目01',
    //   catg: 'test'
    // },
    // {
    //   title: '项目02',
    //   content: '项目01',
    //   catg: 'test'
    // },
    // {
    //   title: '项目03',
    //   content: '项目01',
    //   catg: 'test'
    // },
    // {
    //   title: '项目04',
    //   content: '项目01',
    //   catg: 'test'
    // },
    // {
    //   title: '前端安全02',
    //   content: '前端安全02',
    //   catg: 'safe'
    // },
    {
      title: "React-native01",
      content: "React-native01",
      catg: "rn"
    },
    {
      title: "React-native02",
      content: "React-native02",
      catg: "rn"
    },
    {
      title: "React-native03",
      content: "React-native03",
      catg: "rn"
    },
    {
      title: "React-native04",
      content: "React-native04",
      catg: "rn"
    },
    {
      title: "休息",
      content: `
         休息
             `,

      catg: "rest"
    },
    {
      title: "flutter01",
      content: "flutter实战",
      catg: "flutter"
    },
    {
      title: "flutter02",
      content: "flutter实战",
      catg: "flutter"
    },
    {
      title: "flutter03",
      content: "flutter实战",
      catg: "flutter"
    },
    {
      title: "flutter04",
      content: "flutter实战",
      catg: "flutter"
    },
    {
      title: "flutter05",
      content: "flutter实战",
      catg: "flutter"
    },
    {
      title: "小程序01",
      content: "微信原生小程序云开发",
      catg: "mp"
    },
    {
      title: "小程序02",
      content: "UniApp跨端开发实战",
      catg: "mp"
    },
    {
      title: "小程序03",
      content: "Taro小程序框架入门",
      catg: "mp"
    },
    {
      title: "前端自动化测试",
      content: "通过vue3学测试",
      catg: "test"
    },
    {
      title: "Vue3实战+整体分析",
      content: "源码剖析",
      catg: "react-src"
    },
    {
      title: "算法",
      content: "算法",
      catg: "algorithm"
    },
    {
      title: "休息",
      content: `
         休息
             `,

      catg: "rest"
    },
    {
      title: "面试",
      content: "面试",
      catg: "interview"
    },
    {
      title: "结课",
      content: "结课",
      catg: "end"
    }
  ]
};
const catgTeachers = {};
Object.entries(obj.teachers).forEach(val => {
  const [name, catg] = val;
  catg.split(",").forEach(v => {
    catgTeachers[v] = name;
  });
});
obj.details.map(v => {
  v.teacher = catgTeachers[v.catg];
  return v;
});
console.log("17", obj.details.length);

export default obj;
